<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    /*   var arr = [].concat(1, 2).concat(3, 4).concat(5, 6);
      console.log(arr);
  
      var s = new Set();
      s.add(1).add(2).add(3).add(4);
      console.log(s);
      
        链式操作的本质  方法的返回值=>同种类型的数据(新|原本的)
      */

    // 结论:
    // 采用链式的then，可以指定一组按照次序调用的回调函数,这时，前一个回调函数，有可能返回的还是一个Promise对象（即有异步操作），这时后一个回调函数，就会等待该Promise对象的状态发生变化，才会被调用,该Promise实例存储的数据作为参数，传入后一个回调函数。,以此类推。(注意:1.返回的数据是Promise实例,后续的回调函数 需要等待该实例状态改变,再将结果向后传递  2. catch可以捕获整个链式操作过程中 出现的错误)

    // then链式操作过程中规律 ()
    // 同步直接传,异步(promise实例)插队传
    // 成功就走then,失败走catch (一失足成千古恨)

    var p = new Promise(function (resolve, reject) {
        // aaaa;
        setTimeout(function () {
            resolve(1);
        }, 2000)
    })

    console.log(p);
    p.then(function (num) {
        console.log("callback1:", num); // 1
        return randNum();  // 调用randNum() =>  返回Promise实例(默认进行中)  等待1s 随机生成一个数
    }).then(function (num) {
        console.log("callback2:", num);
        return randNum();
    }).then(function (num) {
        console.log("callback3:", num);
    }).catch(function (err) {
        console.log(err);
    })


    function randNum(max = 100) { // 调用此方法  等待1s 随机生成一个数  => 返回Promise实例(默认进行中)
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                var num = Math.round(Math.random() * max);
                resolve(num);
            }, 1000)
        })
    }





    // 异步操作 => p  => (i1)p1  => (i2)p2  => p3  
    // 后续实例的状态 依赖于前面实例的回调函数的执行的结果

    /* var p = new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve(1);
            // reject(1);
        }, 2000);
    })

    console.log("p", p);

    var p1 = p.then(function (num) {
        console.log("callback1:", num);//1
        return randNum();  // i1   调用randNum() =>  返回Promise实例(默认进行中)  等待1s 随机生成一个数
    })
    console.log("p1", p1);

    var p2 = p1.then(function (num) {
        console.log("callback2:", num);//2
        return randNum();  // i2   调用randNum() =>  返回Promise实例(默认进行中)  等待1s 随机生成一个数
    })
    console.log("p2", p2);

    var p3 = p2.then(function (num) {
        console.log("callback3:", num);
    })
    console.log("p3", p3);

    p3.catch(function (err) {
        console.log("错误:", err);
    })


    function randNum(max = 100) { // 调用此方法  等待1s 随机生成一个数  => 返回Promise实例(默认进行中)
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                var num = Math.round(Math.random() * max);
                resolve(num);
            }, 1000)
        })
    } */

</script>

</html>